﻿<!DOCTYPE HTML>
<html lang="zh">
<head>
<title>在退出时 - 语法 &amp; 使用 | AutoHotkey v2</title>
<meta name="description" content="The 在退出时 function specifies a callback function or subroutine to call automatically when the script exits." />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
<script type="text/javascript">$(function(){0<=window.navigator.userAgent.toLowerCase().indexOf("ucbrowser")&&CaoNiMaDeUc()})</script>
</head>
<body>

<h1>在退出时</h1>

<p>指定一个在脚本退出时自动调用的<a href="../Functions.htm">函数</a>.</p>

<pre class="Syntax"><span class="func">在退出时</span> 检索函数 <span class="optional">, AddRemove</span></pre>
<h2 id="Parameters">参数</h2>
<dl>

  <dt>检索函数</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#strings">字符串</a>或<a href="../Concepts.htm#objects">对象</a></p>
    <p>脚本退出时调用的函数的名称或<a href="../objects/Functor.htm">函数对象</a>. 该函数可以定义参数, 如下所示. 如果 在退出时 函数返回一个非零整数, 脚本将不会继续退出. 否则, 脚本将在所有注册函数运行完成之后退出.</p>
    <pre class="Syntax"><i>MyFunction</i>(<a href="#ExitReason">ExitReason</a>, <a href="ExitApp.htm">ExitCode</a>)</pre>
  </dd>
  
  <dt>AddRemove</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#numbers">整数</a></p>
    <p>下列值之一:<br>
  <strong>1</strong>(默认): 在所有之前注册的函数之后调用该函数.<br>
  <strong>-1</strong>: 在所有之前注册的函数之前调用该函数.<br>
  <strong>0</strong>: 不调用该函数.</p>
  </dd>

</dl>

<h2 id="Remarks">备注</h2>
<p>在退出时 函数可以注册任意多个. 在退出时 函数通常不应该调用 退出应用; 如果调用了, 脚本将会立即退出.</p>
<p>当脚本以任何方式退出时, 将调用 在退出时 函数(除非被类似 "结束任务" 的方式强行终止). 每当 <a href="_SingleInstance.htm">#单例模式</a> 和 <a href="Reload.htm">重载</a> 请求前一个实例终止时, 也会调用它.</p>
<p>脚本可以通过 <code>在收到消息时(0x11, &quot;WM_QUERYENDSESSION&quot;)</code>(有关工作脚本, 请参阅 <a href="OnMessage.htm#ExShutdown">在收到消息时 示例 #2</a>) 来检测和是否选择中止系统关闭或注销.</p>
<p>在退出时 <a href="../misc/Threads.htm">线程</a>不遵守 <a href="_MaxThreads.htm">#最大线程数</a>(它总是在需要的时候启动). 此外, 当它运行时, 它不会被任何<a href="../misc/Threads.htm">线程</a>中断, 包括<a href="../Hotkeys.htm">热键</a>, <a href="../objects/Menu.htm">自定义菜单项</a>和<a href="SetTimer.htm">计时器子程序</a>. 不过, 它会在这些情况下被中断(终止)(且脚本也同时被终止了), 用户从托盘菜单或主菜单栏中选择 退出, 或由于 <a href="Reload.htm">重载</a> 或 <a href="_SingleInstance.htm">#单例模式</a> 而要求脚本终止. 由于这些原因, 在退出时 函数应该被设计为尽快结束, 除非用户知道该怎么做.</p>
<p>如果 在退出时 <a href="../misc/Threads.htm">线程</a>遇到失败条件, 比如运行错误时, 脚本将会终止.</p>
<p>如果 在退出时 <a href="../misc/Threads.htm">线程</a>是由 <a href="Exit.htm">退出</a> 或 <a href="ExitApp.htm">退出应用</a> 函数启动并指定了退出码, 则将使用该退出码, 除非 在退出时 函数返回 true(阻止退出) 或调用了 退出应用.</p>
<p>每当进行一个退出尝试时, 每个 在退出时 函数都使用 <a href="SendMode.htm">发送模式</a> 等设置的默认值重新启动. 这些默认值可以在<a href="../Scripts.htm#auto">自动执行段</a>中更改.</p>
<p>如果 在退出时 函数声明了参数, 它的第一个参数是以下单词之一:</p>
<table class="info" id="ExitReason">
  <tr id="logoff">
    <td>Logoff</td>
    <td>用户正在注销.</td>
  </tr>
  <tr>
    <td>关机</td>
    <td>正在关闭或重启系统, 例如使用 <a href="Shutdown.htm">关机</a> 函数.</td>
  </tr>
  <tr>
    <td>Close</td>
    <td>脚本发送 WM_CLOSE 或 WM_QUIT 消息, 出现致命错误, 或者正在被其他方式关闭. 尽管这些情况都很少见, 然而 WM_CLOSE 可能是由于在脚本主窗口中使用 <a href="WinClose.htm">关闭窗口</a> 函数引起的. 要关闭(隐藏) 窗口而不终止脚本, 请使用 <a href="WinHide.htm">隐藏窗口</a>.</td>
  </tr>
  <tr>
    <td>Error</td>
    <td>在不是<a href="_Persistent.htm">持续运行的</a>脚本中发生了运行时错误. 运行时错误的一个例子是 <a href="Run.htm">Run/RunWait</a> 无法启动指定的程序或打开指定的文档.</td>
  </tr>
  <tr>
    <td>Menu</td>
    <td>用户在主窗口的菜单或标准托盘菜单中选择了 退出.</td>
  </tr>
  <tr>
    <td>退出</td>
    <td>使用了 <a href="Exit.htm">退出</a> 或 <a href="ExitApp.htm">退出应用</a> 函数(包括<a href="../objects/Menu.htm">自定义菜单项</a>).</td>
  </tr>
  <tr>
    <td>重载</td>
    <td>正通过 <a href="Reload.htm">重载</a> 函数或菜单项重载脚本.</td>
  </tr>
  <tr>
    <td>Single</td>
    <td>由于 <a href="_SingleInstance.htm">#单例模式</a> 的原因, 脚本正被它自身的新实例代替.</td>
  </tr>
</table>

<h2 id="Related">相关</h2>
<p><a href="OnError.htm">在报错时</a>, <a href="OnMessage.htm">在收到消息时</a>, <a href="CallbackCreate.htm">创建回调</a>, <a href="OnClipboardChange.htm">在剪贴板内容改变时</a>, <a href="ExitApp.htm">退出应用</a>, <a href="Shutdown.htm">关机</a>, <a href="_Persistent.htm">#持续运行</a>, <a href="../misc/Threads.htm">线程</a>, <a href="Return.htm">返回</a></p>

<h2 id="Examples">示例</h2>
<div class="ex" id="ExAdvanced">
<p><a href="#ExAdvanced">#1</a>: 下面的示例使用 <a href="_Persistent.htm">#持续运行</a> 来防止脚本自动退出. 运行脚本后, 右键单击托盘图标并单击 <em>退出</em> 以测试 在退出时 函数. 然后单击 "Yes" 终止脚本, 或单击 "No" 使脚本继续运行.</p>
<pre>#持续运行

<em>; 注册一个在退出时被调用的函数:</em>
在退出时("ExitFunc")

<em>; 注册一个在退出时被调用的对象:</em>
在退出时(<a href="ObjBindMethod.htm">对象绑定方法</a>(MyObject, "Exiting"))

ExitFunc(ExitReason, ExitCode)
{
    如果 ExitReason != "Logoff" and ExitReason != "Shutdown"
    {
        Result := 信息框("Are you sure you want to 退出?",, 4)
        如果 Result = "No"
            返回 1  <em>; 在退出时 函数必须返回非零值来阻止退出.</em>
    }
    <em>; 不要调用 退出应用 -- 这会阻止其他 在退出时 函数的调用.</em>
}

class MyObject
{
    Exiting()
    {
        信息框 "MyObject is cleaning up prior to exiting..."
        <em>/*
        this.SayGoodbye()
        this.CloseNetworkConnections()
        */</em>
    }
}</pre>
</div>

</body>
</html>